#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <stdlib.h>
#include<sys/wait.h>


void handler(int signo)
{
	std::cout << "get a new signal " << signo << std::endl; 
}
int main()
{
	// 信号捕捉3种方式  1.默认  2.忽略  3.自定义
	//::signal(2,handler);  // 自定义
	::signal(2,SIG_IGN); // ignore:忽略，本身就是一种信号捕捉方法，动作是默认
	::signal(2,SIG_DFL); // default:默认

	while(1)
	{
		pause();
	}

	return 0;
}

// int main()
// {
// 	if(fork() == 0)
// 	{
// 		sleep(1);
// 		int a = 10;
// 		a /= 10;

// 		exit(0);
// 	}
// 	int status = 0;
// 	waitpid(-1,&status,0);

// 	printf("exit signal:%d,core dump:%d\n",status&0x7F,(status>>7)&1);

// 	return 0;
// }



// void handler(int signo)
// {
// 	std::cout << "get a signo" << signo << std::endl;
// }
// // 异常产生信号
// // C/C++中，常见的异常，进程崩溃了，OS给目标进程发送相应的错误信号，进而导致进程退出
// int main()
// {
// 	//signal(11,handler);

// 	// 浮点数异常 8号 SIGFPE
// 	int a = 10;
// 	a /= 0;

// 	// 野指针 11号  SIGSEGV
// 	// int *p = nullptr;
// 	// *p = 100;

// 	while(1);
// }


// void Usage(std::string proc)
// {
// 	std::cout << "Usage: " << proc << "signumber processid" << std::endl;
// }
// int number = 0;
// void die(int signumber)
// {
// 	printf("get a sig: %d,count: %d\n",signumber,number);
// 	exit(0);
// }
// int main(int argc, char *argv[])
// {
// 	// 统计我的服务器1s可以将计数器累加到多少
// 	// alarm(1); // 我自己会在1s之后，收到一个SIGALRM信号，默认终止
// 	// signal(SIGALRM,die);  

// 	alarm(3);
// 	sleep(1);
// 	int n = alarm(0); // 0 表示取消闹钟
// 	std::cout << "n: " << n << std::endl;


// 	// while(1)
// 	// {
// 	// 	number++;
// 	// 	//printf("count:%d\n",number++); IO影响计算速度
// 	// }

// 	// int cnt = 5;
// 	// while(1)
// 	// {
// 	// 	std::cout << "hahaha alive" <<std::endl;
// 	// 	cnt--;
// 	// 	if(cnt < 0)
// 	// 		raise(9);
// 	// }

// 	// if (argc != 3)
// 	// {
// 	// 	Usage(argv[0]);
// 	// 	exit(1);
// 	// }

// 	// int signumber = std::stoi(argv[1]);
// 	// pid_t id = std::stoi(argv[2]);

// 	// int n = ::kill(id,signumber);
// 	// if(n < 0)
// 	// 	perror("kill");

// 	return 0;
// }

// void Handler(int signo)
// {
// 	// 当对应的信号被触发，内核会将相应的信号编号，传递给自定义方法
// 	std::cout << "Get a signal.signal number is: " << signo << std::endl;
// }

// int main()
// {
// 	// 问题：1.signal为什么不放在循环里面 2.signal如果没有产生2/3号信号呢？
// 	// 1.signal只需要设置一次进程就记住了  2.没产生，就不会调用Handler

// 	// 将2号信号的方法由默认终止->执行自定义方法Handler
// 	signal(SIGINT,Handler);  //2 ctrl + c
// 	signal(SIGINT,Handler);  //3 ctrl + \


// 	while(1)
// 	{
// 		std::cout << "hello world" << std::endl;
// 		sleep(1);
// 	}

// 	return 0;
// }